package com.luych.toolbox.data.service.core;

import com.luych.toolbox.common.enums.CaseType;
import com.luych.toolbox.common.enums.DataSourceType;

import java.util.List;
import java.util.stream.Collectors;

public interface CoreTable {

    DataSourceType getDataSourceType();

    String getName();

    String getComment();

    List<? extends CoreColumn> getColumns();

    String getPrimaryKeyName();

    List<String> getPrimaryKey();

    default String getPageSql(CaseType caseType, long pageSize, long pageNo) {
        return "SELECT * FROM " + caseType.getConvert().apply(this.getName()) + " LIMIT " + (pageNo - 1) * pageSize + ", " + pageSize + ";";
    }

    default String getSelectSql(CaseType caseType) {
        return "SELECT * FROM " + caseType.getConvert().apply(this.getName()) + ";";
    }

    default String getCountSql(CaseType caseType) {
        return "SELECT COUNT(*) FROM " + caseType.getConvert().apply(this.getName()) + ";";
    }

    default String getTruncateSql(CaseType caseType) {
        return "TRUNCATE TABLE " + caseType.getConvert().apply(this.getName()) + ";";
    }

    default String getInsertSql(CaseType caseType) {
        String columns = this.getColumns().stream().map(CoreColumn::getName).sorted().map(caseType.getConvert()).collect(Collectors.joining(","));
        String values = this.getColumns().stream().map(c -> "?").collect(Collectors.joining(","));
        return "INSERT INTO " + caseType.getConvert().apply(this.getName()) + "(" + columns + ") VALUES (" + values + ")";
    }

    String getCreateSql(CaseType caseType);

    String getCommentSql(CaseType caseType);

    default String getRemoveSql(CaseType caseType) {
        return "DROP TABLE " + caseType.getConvert().apply(this.getName()) + ";";
    }

    String getCreatePrimaryKeySql(CaseType caseType);

    String getRemovePrimaryKeySql(CaseType caseType);

}
